#include "Algorytm.h"
#define dopBlad 0.01
using namespace std;

void Algorytm::oblicz(Struktura struktura)
{
	this->struktura = struktura;

	for (int i = 0; i < struktura.rozmiar; i++)
	{
		switch (struktura.obiekty[i].typ)
		{
			case 1:
				generujSpinke(struktura.obiekty[i]);
				break;
			case 2:
				generujJajko(struktura.obiekty[i]);
				break;
			case 3:
				generujOgonek(struktura.obiekty[i]);
				break;
		}
	}

	this->wynik = generujWynik(struktura.obiekty[0]);
}

string Algorytm::getWynik()
{
	return wynik;
}

string Algorytm::generujWynik(Obiekt obiekt)
{
	char* wynik;
	return wynik;
}

string Algorytm::generujSpinke(Obiekt obiekt)
{
	char** wiazania = new char*[(int)round(struktura.energia/2)];
	for (int i = 0; i < round(struktura.energia/2); i++)
		wiazania[i] = new char[2];

	int pozEnergia = struktura.energia;

	wiazania[0] = losujWiazanie();

	int iloscWiazan = 1;
	while (abs(pozEnergia) > (struktura.energia * dopBlad)) //mozliwy blad
	{
		wiazania[iloscWiazan] = losujWiazanie();
		pozEnergia += energiaWiazania(wiazania[iloscWiazan-1], wiazania[iloscWiazan]);
		iloscWiazan++;
	}

	string wynik = "";

	string jajko = "";
	string ogonek = "";
	bool ogonekP = true;

	if (obiekt.iloscDzieci > 0)
		if (struktura.obiekty[obiekt.dzieci[0]].typ == 2)
			jajko = generujJajko(struktura.obiekty[obiekt.dzieci[0]]);
		else
		if (struktura.obiekty[obiekt.dzieci[0]].typ == 3)
		{
			ogonekP = false;
			ogonek = generujOgonek(struktura.obiekty[obiekt.dzieci[0]]);
		}
		else cout << "zle dziecko \n";

	if (obiekt.iloscDzieci > 1)
		if (struktura.obiekty[obiekt.dzieci[1]].typ == 2)
			jajko = generujJajko(struktura.obiekty[obiekt.dzieci[1]]);
		else
		if (struktura.obiekty[obiekt.dzieci[1]].typ == 3)
		{
			ogonekP = true;
			ogonek = generujOgonek(struktura.obiekty[obiekt.dzieci[1]]);
		}
		else cout << "zle dziecko \n";

	if (!ogonekP) wynik = ogonek;

	for (int j = 0; j < iloscWiazan; j++)
		wynik += wiazania[j][0];

	wynik += jajko;

	for (int j = iloscWiazan - 1; j >= 0; j--)
		wynik += wiazania[j][1];

	if (ogonekP) wynik += ogonek;

	return wynik;
}

string Algorytm::generujJajko(Obiekt obiekt)
{
	return "";
}

string Algorytm::generujOgonek(Obiekt obiekt)
{
	return "";
}

char* Algorytm::losujWiazanie()
{
	char* wiazanie = new char[2];

	srand ( time(NULL) );
	switch(rand() % 4)
	{
		case 0:
			wiazanie[0] = 'A';
			wiazanie[1] = 'U';
			break;
		case 1:
			wiazanie[0] = 'U';
			wiazanie[1] = 'A';
			break;
		case 2:
			wiazanie[0] = 'G';
			wiazanie[1] = 'C';
			break;
		case 3:
			wiazanie[0] = 'C';
			wiazanie[1] = 'G';
			break;
	}
	return wiazanie;
}

float Algorytm::energiaWiazania(char* poprzednie, char* biezace)
{
	if (poprzednie[0] == 'A' && poprzednie[1] == 'U')
		return AU::getEnergia(biezace[0], biezace[1]);
	else
	if (poprzednie[0] == 'U' && poprzednie[1] == 'A')
		return UA::getEnergia(biezace[0], biezace[1]);
	else
	if (poprzednie[0] == 'G' && poprzednie[1] == 'C')
		return GC::getEnergia(biezace[0], biezace[1]);
	else
	if (poprzednie[0] == 'C' && poprzednie[1] == 'G')
		return CG::getEnergia(biezace[0], biezace[1]);
	else
		return 0;
}
